




#### 'Archiving' 归档

> 面向对象的程序在运行中会创建一个复杂的对象视图。开发者经常需要以二进制流的形式序列化这个视图。被称为Archiving。
比如使用xib创建文件的时候,编译器就将对象归档为文件.

> 需要从二进制文件中重新获得视图,叫做unArchive

> "只有成员变量和类的名字可以归档"
> "当归档一个root对象时,它同时归档所有的关联对象,关联对象又会关联它们的关联对象"


#### 归档的步骤  

1. 告诉对象怎么自己归档
2. 触发归档的过程

##### NSCoder 和 NSCoding

NSCoding 的协议如下:
    - (void)encodeWithCoder:(NSCoder *)aCoder;
    - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder; // NS_DESIGNATED_INITIALIZER

> NSCoder是二进制流的抽象,开发者可以把二进制写入coder 或 从coder读取数据。
> 'initWithCoder' 从coder读取数据,并将数据保存到成员变量.
> 'encodeWithCoder' 读取到实例变量的值，然后将其写入coder

> NSCoder是一个抽象类,抽象类不会被实例化.相反,抽象类可以被子类继承。开发者可以创建子类实例。 比如说:NSKeyedUnArchiver从一个二进制流读取对象，使用 NSKeyedArchiver 将对象写入二进制流里。 



